package tony.core.model

/**
 * 核心常量.
 *
 * 比如成功返回码, 失败返回码等.
 *
 * 可读取配置.
 * @author tangli
 * @date 2022/09/29 19:20
 */
public data object ApiProperty {
    /**
     * 全局成功返回码.
     *
     * 可由配置文件的 "core.ok-code" 修改默认值.
     *
     * 默认 20000.
     */
    @get:JvmName("okCode")
    @JvmStatic
    public val okCode: Int
        get() = internalApiProperty.okCode

    /**
     * 全局成功返回消息.
     *
     * 可由配置文件的 "core.ok-msg" 修改默认值.
     *
     * 默认 "操作成功".
     */
    @get:JvmName("defaultOkMessage")
    @JvmStatic
    public val defaultOkMessage: String
        get() = internalApiProperty.defaultOkMessage

    /**
     * 全局未认证返回码.
     *
     * 可由配置文件的 "core.unauthorized-code" 修改默认值.
     *
     * 默认 40100.
     */
    @get:JvmName("unauthorizedCode")
    @JvmStatic
    public val unauthorizedCode: Int
        get() = internalApiProperty.unauthorizedCode

    /**
     * 全局错误返回码.
     *
     * 可由配置文件的 "core.internal-server-error-code" 修改默认值.
     *
     * 默认 50000.
     */
    @get:JvmName("errorCode")
    @JvmStatic
    public val errorCode: Int
        get() = internalApiProperty.errorCode

    /**
     * 全局错误返回消息.
     *
     * 可由配置文件的 "core.internal-server-error-msg" 修改默认值.
     *
     * 默认 "访客太多，请稍后重试".
     */
    @get:JvmName("errorMsg")
    @JvmStatic
    public val errorMsg: String
        get() = internalApiProperty.errorMsg

    /**
     * 全局错误请求码. 一般是请求不合法, 比如 http 方法不对应等.
     *
     * 可由配置文件的 "core.bad-request-code" 修改默认值.
     *
     * 默认 40000.
     */
    @get:JvmName("badRequestCode")
    @JvmStatic
    public val badRequestCode: Int
        get() = internalApiProperty.badRequestCode

    /**
     * 全局错误请求返回消息. 一般是请求不合法, 比如 http 方法不对应等.
     *
     * 可由配置文件的 "core.bad-request-msg" 修改默认值.
     *
     * 默认 "请求有误，请检查后输入".
     */
    @get:JvmName("badRequestMsg")
    @JvmStatic
    public val badRequestMsg: String
        get() = internalApiProperty.badRequestMsg

    /**
     * 全局校验不通过返回码.
     *
     * 可由配置文件的 "core.precondition-failed-code" 修改默认值.
     *
     * 默认 40010.
     */
    @get:JvmName("preconditionFailedCode")
    @JvmStatic
    public val preconditionFailedCode: Int
        get() = internalApiProperty.preconditionFailedCode

    /**
     * 全局资源不存在返回码.
     *
     * 默认 40404.
     */
    @get:JvmName("notFoundCode")
    @JvmStatic
    public val notFoundCode: Int
        get() = internalApiProperty.notFoundCode

    /**
     * 全局资源不存在返回消息.
     *
     * 默认 "该对象不存在".
     */
    @get:JvmName("notFoundMessage")
    @JvmStatic
    public val notFoundMessage: String
        get() = internalApiProperty.notFoundMessage

    /**
     * 更新 API 属性
     * @param [okCode] 确定代码
     * @param [defaultOkMessage] 默认确定消息
     * @param [unauthorizedCode] 未经授权代码
     * @param [errorCode] 错误代码
     * @param [errorMsg] 错误消息
     * @param [badRequestCode] 错误请求代码
     * @param [badRequestMsg] 错误请求消息
     * @param [preconditionFailedCode] 先决条件失败代码
     * @param [notFoundCode] 未找到代码
     * @param [notFoundMessage] 未找到消息
     * @author tangli
     * @date 2025/09/18 12:30
     */
    public fun updateApiProperty(
        okCode: Int = 20000,
        defaultOkMessage: String = "操作成功",
        unauthorizedCode: Int = 40100,
        errorCode: Int = 50000,
        errorMsg: String = "访客太多，请稍后重试",
        badRequestCode: Int = 40000,
        badRequestMsg: String = "请求有误，请检查后输入",
        preconditionFailedCode: Int = 40010,
        notFoundCode: Int = 40404,
        notFoundMessage: String = "数据不存在",
    ) {
        synchronized(internalApiProperty) {
            internalApiProperty =
                InternalApiProperty(
                    okCode,
                    defaultOkMessage,
                    unauthorizedCode,
                    errorCode,
                    errorMsg,
                    badRequestCode,
                    badRequestMsg,
                    preconditionFailedCode,
                    notFoundCode,
                    notFoundMessage
                )
        }
    }
}

private var internalApiProperty = InternalApiProperty()

private data class InternalApiProperty(
    var okCode: Int = 20000,
    var defaultOkMessage: String = "操作成功",
    var unauthorizedCode: Int = 40100,
    val errorCode: Int = 50000,
    val errorMsg: String = "访客太多，请稍后重试",
    val badRequestCode: Int = 40000,
    val badRequestMsg: String = "请求有误，请检查后输入",
    val preconditionFailedCode: Int = 40010,
    val notFoundCode: Int = 40404,
    val notFoundMessage: String = "数据不存在",
)
